<?php

// 工厂方法模式
// 工厂方法模式核心是工厂类不再负责所有对象的创建，
// 而是将具体创建的工作交给子类去做，成为一个抽象工
// 厂角色，它仅负责给出具体工厂类必须实现的接口，而
// 不接触哪一个产品类应当被实例化这种细节

interface Tell
{
    function call();
    function receive();
}

class XiaoMi implements Tell
{
    function call()
    {
        echo '我在使用小米手机打电话<br/>';
    }

    function receive()
    {
        echo '我在使用小米手机接电话<br/>';
    }
}

class HuaWei implements Tell
{
    function call()
    {
        echo '我在使用华为手机打电话<br/>';
    }

    function receive()
    {
        echo '我在使用华为手机接电话<br/>';
    }
}

// 工厂类只负责规定接口，具体的实现交给子类
interface Factory
{
    static function createPhone();
}

class XiaoMiFactory implements Factory
{
    static function createPhone()
    {
        return new XiaoMi();
    }
}

class HuaWeiFactory implements Factory
{
    static function createPhone()
    {
        return new HuaWei();
    }
}

// 测试
$xiaomi = XiaoMiFactory::createPhone();
$huawei = HuaWeiFactory::createPhone();
$xiaomi->call();
$xiaomi->receive();
$huawei->call();
$huawei->receive();